################################
# 1. 基本用法
#    变量的定义方式
use Data::Dumper;  # 导入Debug工具

%hash1={};  #初始化%h为空数组 
%h=('a',1,'b',2); #用数组初始化%h为a=>1,b=>2 
%hash3=('a'=>1,'b'=>2); #意义同上，只是另一种更形象化的写法。%h=('a'=>1,'b'=>2);
%hash4=(a=>1,b=>2); #如果key是字符串，可以省略引号。下面这行和上面那行是一样的%h=(a=>1,b=>2);
$hash5{b}='2b';   # 直接赋值

################################
# 2.变量的读取

print "$hash4{a}\n";
delete $hash5{b};   #删除key用delete 
undef %hash5;  # 清空Perl Hash

################################
# 3.高级使用, 遍历，排序，枚举等
@all_keys=keys %h;  # 得到hash的所有键值，注意，键值是乱序。
@all_keys=sort{$h{$b} <=> $h{$a}} ( keys %h); # 是按hash的值从大往小排列的
exists($h{$key});  #判断Perl Hash是否包含key

$hash_size=keys %h;  # Perl Hash的长度,想要知道一个hash存放多少数据

# 遍历一个Perl Hash
while(my($k,$v)=each(%h)){
	print "$k--->$v\n";
}

################################
# 4.高级使用, 指针
$h_ref=\%h;    			#获得一个hash的reference,
%aHash=%{$h_ref};   	#把hash reference当成hash用 
$value=$h_ref->{akey}; 	#这个和  %h{akey}  是一样的


################################
# 5.高级使用, 传递Perl Hash到函数
%h=();
$h{a}=1; 
foo(\%h); 
print $h{b},"\n";

# 一般都是传递一个reference到函数
sub foo{
	my ($h)=@_; 
	print $h->{a},"\n"; #打印出1 $h->{b}=2;
}

# 函数可以返回Perl Hash，# 但是这样等于把整个hash从%fh复制到了%h，效率比较低。可以考虑返回hash的引用:
sub foo1{
	my %fh; 
	$fh{a}=1; 
	return %h;
} 
my %h=foo1();
print "$h{a}\n";

# 如果就是想复制，也可以用这种方法。不用担心在sub foo里的%fh是局部变量，
# Perl会自动管理内存。它会发现%fh被$hr引用，就不会清理%fh的内存，并且$hr失效后释放内存。

sub foo2{
	my %fh; 
	$fh{a}=1; 
	return \%fh;
} 
my $hr=foo(); 
print "$hr->{a}\n";

